package Snake;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

//游戏面板
public class GamePanel extends JPanel implements KeyListener, ActionListener {
    //游戏失败判定
    boolean isFail=false;

    //设置蛇的长度
    int length;
    //设置蛇的X坐标
    int[] sankeX=new int[600];
    //设置蛇的Y坐标
    int[] sankeY=new int[600];
    //蛇头的朝向
    String fx;
    //定时器
    Timer timer=new Timer(100,this);//100毫秒执行一次
    //食物坐标
    int foodX;
    int foodY;
    //随机数
    Random random=new Random();
    //游戏当前状态
    boolean isStart=false;//默认不开始

    public GamePanel(){
        init();//初始化
        this.setFocusable(true);//获得焦点事件
        this.addKeyListener(this);//获得键盘事件
    }

    public void init(){
        length=3;//初始长度
        sankeX[0]=100; sankeY[0]=400;
        sankeX[1]=75; sankeY[1]=400;
        sankeX[2]=50; sankeY[2]=400;
        fx="R";
        timer.start();
        //初始化食物位置
        foodX=25+25*random.nextInt(34);
        foodY=75+25*random.nextInt(24);
    }



    //绘制面板
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);//清屏
        this.setBackground(Color.WHITE);//设置背景颜色为白色

        //Data.header.paintIcon(this,g,25,11);//绘制标题
        g.fillRect(25,11,850,50);

        //设置字体颜色
        g.setColor(Color.WHITE);
        //设置字体
        g.setFont(new Font("微软雅黑",Font.BOLD,40));
        g.drawString("贪吃蛇",375,45);

        g.setColor(Color.DARK_GRAY);

        g.fillRect(25,75,850,600);//设置游戏区域

        //绘制食物
        Data.food.paintIcon(this,g,foodX,foodY);

        //绘制蛇的头
        switch (fx){
            case "R":
                Data.right.paintIcon(this,g,sankeX[0],sankeY[0]);//蛇的头初始化向右
                break;
            case"L":
                Data.left.paintIcon(this,g,sankeX[0],sankeY[0]);//蛇的头初始化向左
                break;
            case"U":
                Data.up.paintIcon(this,g,sankeX[0],sankeY[0]);//蛇的头初始化向上
                break;
            case"D":
                Data.down.paintIcon(this,g,sankeX[0],sankeY[0]);//蛇的头初始化向下
                break;
        }

        //绘制蛇的身体
        for (int i = 1; i <length ; i++) {
            Data.body.paintIcon(this,g,sankeX[i],sankeY[i]);//蛇的身体
        }


        //游戏状态
        if (isStart==false){
            //设置字体颜色
            g.setColor(Color.WHITE);
            //设置字体
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("按下空格开始游戏",300,400);
        }


        if(isFail){
            //设置字体颜色
            g.setColor(Color.red);
            //设置字体
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("按下空格重新开始游戏",300,400);
        }

    }


    //设置键盘监听
    @Override
    public void keyPressed(KeyEvent e) {
        //获得键盘按键
        if(isFail==false){
            if(e.getKeyCode()==KeyEvent.VK_SPACE){
                isStart=!isStart;
                repaint();
            }
        }
        else {
            if(e.getKeyCode()==KeyEvent.VK_SPACE){
                isFail=!isFail;
                init();
                repaint();
            }
        }

        //键盘控制小蛇移动
        switch (e.getKeyCode()){
            case KeyEvent.VK_S:
                fx="D";
                break;
            case KeyEvent.VK_A:
                fx="L";
                break;
            case KeyEvent.VK_D:
                fx="R";
                break;
            case KeyEvent.VK_W:
                fx="U";
                break;

        }
    }




    //事件监听，需要通过事件来刷新
    @Override
    public void actionPerformed(ActionEvent e) {
        if(isStart==true && isFail==false){
            for (int i = 1; i <length ; i++) {
                if(sankeX[0]==sankeX[i] && sankeY[0]==sankeY[i]){
                    isFail=true;
                }
            }
            //吃食物长大
            if(sankeX[0]==foodX &&sankeY[0]==foodY){
                length=length+1;
                foodX=25+random.nextInt(34)*25;
                foodY=75+random.nextInt(24)*25;
            }

            for (int i=length-1;i>0;i--){//后一节身体移动到前一节身体位置
                sankeX[i]=sankeX[i-1];
                sankeY[i]=sankeY[i-1];
            }


            switch (fx){
                case "R":
                    sankeX[0]=sankeX[0]+25;
                    if(sankeX[0]>850)//判断是否超出边界
                        sankeX[0]=25;
                    break;
                case"L":
                    sankeX[0]=sankeX[0]-25;
                    if(sankeX[0]<25)//判断是否超出边界
                        sankeX[0]=850;
                    break;
                case"U":
                    sankeY[0]=sankeY[0]-25;
                    if(sankeY[0]<75)//判断是否超出边界
                        sankeY[0]=650;
                    break;
                case"D":
                    sankeY[0]=sankeY[0]+25;
                    if(sankeY[0]>650)//判断是否超出边界
                        sankeY[0]=75;
                    break;
            }
            repaint();//重画页面
        }
        timer.start();//触发计时器
    }
    @Override
    public void keyTyped(KeyEvent e) {
    }
    @Override
    public void keyReleased(KeyEvent e) {
    }
}
